package com.demo.coretech.innerclass;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

/**
 * @Authors：gaoyang
 * @CreateTime：2021/11/27 09:21
 * @Description：todo
 */
public class TalkingClock {
    private int interval;
    private boolean beep;

    public TalkingClock(int interval, boolean beep) {
        this.interval = interval;
        this.beep = beep;
    }

    //这是匿名内部类
    public void start2(){
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("匿名内部类");
            }
        };
    }

    public void start() {
        /**
         * 该类只存在于start方法中，其他地方不可见
         */
        class TimePrint implements ActionListener{

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("这是一个局部内部类");
            }
        }
        ActionListener listener = new TimePrinter();
        Timer t = new Timer(interval,listener);
        t.start();
    }

    /**
     * 内部类TimePrinter
     * 既可以访问自身的数据域，也可以访问创建他的外围类的数据域
     * 因为TimePrinter没有定义构造器，所以编译器为这个类生成了一个默认的构造器其代码如下：
     * public TimePrinter(TalkingClock clock)
     * {
     *     outer = clock;
     * }
     */
    public class TimePrinter implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("at the one . the time is "+new Date());
            if (beep){
                Toolkit.getDefaultToolkit().beep();
            }
        }
    }
}
